use std::ops::ControlFlow as 控制流;
use std::sync::OnceLock as 單次鎖;
use None as 無;
use 控制流::{Break as 中止, Continue as 繼續};

use table::拼音轉換;
mod table;

pub use trie::{對照表, 讀取對照表, 轉換器, 配置參數};

pub const 漢字拼音表配置參數: 配置參數 = 配置參數 {
    忽略行首: "#",
    欄分隔符: "\t",
    對照項分隔符: 無,
};

pub fn 漢字轉威妥瑪拼音(漢字: &str) -> String {
    漢字轉拼音(漢字, "威妥瑪拼音")
        .replace('ê', "e")
        .replace('ŭ', "u")
        .replace('ʻ', "'")
}

static 漢字拼音表: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/data/chars.tsv");
static 詞組拼音表: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/data/phrases.tsv");

pub fn 漢字轉拼音(漢字: &str, 目標拼音方案: &str) -> String {
    let 對照表 =
        拼音對照表.get_or_init(|| 讀取對照表(漢字拼音表, 詞組拼音表, 漢字拼音表配置參數).unwrap());
    let mut 輸出 = String::new();
    let mut 句首 = true;
    轉換器(漢字, &對照表, |拼音| {
        let Ok(拼音) = 拼音 else {
            return 中止(());
        };
        let mut 拼音 = 拼音轉換(拼音, "漢語拼音方案", 目標拼音方案).to_string();
        if 句首 {
            句首 = false;
            拼音[..1].make_ascii_uppercase();
        }
        輸出.push_str(&拼音);
        輸出.push(' ');
        繼續(())
    });
    輸出.pop();
    輸出
}

static 拼音對照表: 單次鎖<對照表> = 單次鎖::new();
